import { defineStore } from "pinia";

/**
 * 系统状态栏和导航栏相关信息类型定义
 */
type SystemBarsType = {
    statusBarHeight: number; // 状态栏高度
    navigationBarHeight: number; // 导航栏高度
    menuButtonHeight: number; // 菜单按钮高度（主要用于微信小程序）
    menuButtonTop: number; // 菜单按钮距离顶部的距离（主要用于微信小程序）
    screenWidth: number; // 屏幕宽度
    screenHeight: number; // 屏幕高度
    isIPhoneWithNotch: boolean; // 是否是带刘海的 iPhone
    isIPhone: boolean; // 是否是 iPhone 设备
    hasBottomNotch: boolean; // 是否有底部安全区（如 iPhone X 及以上机型）
};

/**
 * 定义系统信息状态管理 store
 * 使用 Pinia 进行状态管理，用于存储设备屏幕、状态栏、导航栏等系统 UI 信息
 */
export const useSystemStore = defineStore("system", {
    /**
     * 初始化系统状态数据
     * @returns 返回初始化的系统状态对象
     */
    state: (): SystemBarsType => ({
        statusBarHeight: 0,
        navigationBarHeight: 44, // 默认值
        menuButtonHeight: 0,
        menuButtonTop: 0,
        screenWidth: 0,
        screenHeight: 0,

        isIPhoneWithNotch: false,
        isIPhone: false,
        hasBottomNotch: false
    }),
    actions: {
        /**
         * 异步更新系统状态栏和导航栏相关高度信息
         * 包括获取设备型号、平台类型、屏幕尺寸、安全区域等信息，并判断是否为带刘海的 iPhone 设备
         */
        async updateSystemBarHeight() {
            const systemInfo = uni.getSystemInfoSync();
            const model = systemInfo.model; // 设备型号（如 'iPhone X'）
            const screenHeight = systemInfo.screenHeight; // 屏幕高度
            const platform = systemInfo.platform; // 平台（ios/android）

            const windowInfo = uni.getWindowInfo();

            // 判断是否为 iPhone 设备
            const isIPhone = /iphone/i.test(model) || platform === "ios";

            // 判断是否为带刘海的 iPhone 设备（根据屏幕尺寸匹配特定机型）
            const isIPhoneWithNotch =
                isIPhone &&
                ((screenHeight === 812 && systemInfo.screenWidth === 375) || // iPhone X/XS/11 Pro
                    (screenHeight === 896 && systemInfo.screenWidth === 414) || // iPhone XR/XS Max/11/11 Pro Max
                    (screenHeight === 844 && systemInfo.screenWidth === 390) || // iPhone 12/13
                    (screenHeight === 926 && systemInfo.screenWidth === 428) || // iPhone 12/13 Pro Max
                    (screenHeight === 852 && systemInfo.screenWidth === 393) || // iPhone 14 Pro
                    (screenHeight === 932 && systemInfo.screenWidth === 430)); // iPhone 14 Pro Max

            const safeArea = systemInfo.safeArea; // 安全区域信息
            const hasBottomNotch = safeArea && screenHeight - safeArea.bottom > 0;

            const statusBarHeight = windowInfo.statusBarHeight || 0;

            let menuButtonHeight = 0;
            let menuButtonTop = 0;

            // #ifdef MP-WEIXIN
            // 微信小程序环境下获取胶囊菜单按钮的位置和尺寸
            const menuRect = uni.getMenuButtonBoundingClientRect();
            menuButtonHeight = menuRect.height;
            menuButtonTop = menuRect.top;
            // #endif

            // 计算并设置导航栏高度
            this.navigationBarHeight = menuButtonHeight + (menuButtonTop - statusBarHeight) * 2;
            this.statusBarHeight = statusBarHeight;

            this.menuButtonHeight = menuButtonHeight;
            this.menuButtonTop = menuButtonTop;

            this.screenWidth = windowInfo.screenWidth;
            this.screenHeight = windowInfo.screenHeight;

            this.isIPhoneWithNotch = isIPhoneWithNotch;
            this.isIPhone = isIPhone;
            this.hasBottomNotch = hasBottomNotch ?? false;
        }
    },
    getters: {
        /**
         * 获取适用于页面容器的安全区域样式（包含顶部 padding 和导航栏高度）
         * @param state 当前状态对象
         * @returns 返回包含 paddingTop 和 height 的样式对象
         */
        safeAreaStyle: (state) => ({
            paddingTop: `${state.statusBarHeight}px`,
            height: `${state.navigationBarHeight}px`
        }),

        /**
         * 获取仅包含状态栏高度的安全区域样式
         * @param state 当前状态对象
         * @returns 返回包含 paddingTop 的样式对象
         */
        safeAreaStatusBarStyle: (state) => ({
            paddingTop: `${state.statusBarHeight}px`
        }),

        /**
         * 根据设备类型返回对应的底部安全区内边距类名
         * @param state 当前状态对象
         * @returns 返回对应的安全区底部类名字符串
         */
        safeAreaBottomClass: (state) => {
            return state.isIPhone && state.hasBottomNotch ? "safe-area-inset-bottom-iphonex" : "safe-area-inset-bottom";
        }
    },
    persist: {
        enabled: true,
        strategies: [
            {
                key: import.meta.env.MODE + "-app-store"
            }
        ]
    }
});
